// const puppeteer = require("puppeteer");
// const path      = require("path");
//
// //登录页
// const loginPageUrl = 'https://www.merchantwords.com/login';
// //搜索页
// const searchUrl    = 'https://www.merchantwords.com/search/us/';
// //登录成功标志
// const logonFlag    = 'https://www.merchantwords.com/my-account';
// //登录状态检查
// const eventUrl     = 'https://www.merchantwords.com/api/event';
// //login跳转
// const loginJump    = 'https://www.merchantwords.com/login';
//
// //黑名单网址
// const blackList = [
//     'https://www.merchantwords.com/products',
//     'https://www.merchantwords.com/products-amazon-seo-service',
//     'https://www.merchantwords.com/amazon-keyword-research-service',
//     'https://www.merchantwords.com/keywordadvisor-information',
//     'https://www.merchantwords.com/products#signUp'
// ];
//
// class merchant{
//     constructor(options) {
//         if(!merchant.single){
//             this.windowOptions = [
//             ];
//             this.browser = null;
//             this.page = null;
//             this.context = null;
//             this.timeOptions = { waitUntil: ["domcontentloaded"] };
//             this.cookie = options.cookie.toString();
//             this.targetUrl = options.targetUrl;
//             this.userName = options.userName;
//             this.password = options.password;
//             this.options = options;
//             this.monitorTimers = [];
//             this.searchTime = null;
//             this.loginStatus = 0; //登录状态 0(未开启登录模式) 1(开启登录模式)
//             this.closeFn = options.closeFn;
//             this.resetCookie = options.resetCookie;
//             this.productObj = options.productObj;
//             this.bookmarkPath = options.bookmarkPath;
//             this.clearCookieCache = options.clearCacheCookie;
//             merchant.single = this;
//         }
//         return merchant.single;
//     }
//
//     async loadWindow(){
//         console.log(`开始构建浏览器参数`);
//         this.browser = await puppeteer.launch({
//             headless: false,
//             ignoreHTTPSErrors: false,
//             credentialsEnableService:false,
//             passwordManagerEnabled:false,
//             ignoreDefaultArgs: ['--enable-automation','--disable-extensions'],
//             defaultViewport: {
//                 width: 0,
//                 height: 0
//             },
//             args: this.windowOptions,
//             userDataDir: this.bookmarkPath,
//         });
//         this.context = await this.browser.createIncognitoBrowserContext();
//         this.page = await this.browser.newPage();
//         console.log(`上下文初始完毕`);
//         //关闭起始页的page
//         await this.closeFirstPage();
//
//         //开启拦截器
//         this.page.setRequestInterception(true);
//         await this.camouflageBrowser();
//
//         //注入cookie
//         await this.addCookies('www.merchantwords.com');
//         await this.goPage(this.targetUrl);
//         console.log(`打开页面成功`);
//         //页面加载完毕后的后置操作
//         await this.after();
//
//         // await this.closeWindows();
//     }
//
//     async closeFirstPage(){
//         let pages = await this.browser.pages();
//         if(!pages || pages.length === 0){
//             return;
//         }
//         await pages[0].close();
//     }
//
//     /**
//      * 访问页面
//      * @param url
//      * @returns {Promise<void>}
//      */
//     async goPage(url){
//         //打开页面
//         await this.page.goto(url,this.timeOptions);
//     }
//
//     /**
//      * 注入cookie
//      * @param url 网站域名 www.merchantwords.com
//      * @param cookie ck
//      */
//     // async setCookies(url,cookie){
//     //     this.cookie = cookie;
//     //     // await this.removeCookie();
//     //     await this.addCookies(url);
//     //     await this.page.reload(this.targetUrl);
//     // }
//
//     /**
//      * 重新登录
//      */
//   //   async retryLogin(){
//   //       return new Promise(async (resolve, reject) => {
//   //           console.log(`重新登录 userName:${this.userName} password:${this.password}`);
//   //           try {
//   //               //删除cookie
//   //               // await this.removeCookie();
//   //               //激活登录模式
//   //               await this.activationLogin();
//   //               //重定向到登录页
//   //               await this.goPage(loginPageUrl);
//   // /*              //等待登录完毕 获取cookie
//   //               let cookie = await this.checkIsLoginFinish();
//   //               //重置服务器端cookie
//   //               this.resetCookie(this.productObj.productUserId,cookie,this.productObj.token);*/
//   //               resolve()
//   //           } catch (e) {
//   //               console.log(`重新登录异常 e:${e.message}`);
//   //               reject({
//   //                   err:e.message,
//   //                   cookie:''
//   //               })
//   //           }finally {
//   //               await this.stopLogonMode();
//   //           }
//   //       })
//   //   }
//
//     /**
//      * 开启登录模式
//      */
//     // async activationLogin(){
//     //     //激活登录模式
//     //     await this.loginMode();
//     //     //清理缓存cookie
//     //     this.newCookie = null;
//     // }
//
//     /**
//      * 登录模式
//      */
//     // async loginMode(){
//     //     this.loginStatus = 1;
//     // }
//
//     /**
//      * 关闭登录模式
//      * @returns {Promise<void>}
//      */
//     // async stopLogonMode(){
//     //     console.log(`关闭登录模式`);
//     //     this.loginStatus = 0;
//     // }
//
//     /**
//      * 判断是否为登录模式
//      */
//     // async isLoginMode(){
//     //     return this.loginStatus == 1;
//     // }
//
//     /**
//      * 检测是否登录完毕
//      */
//     // async checkIsLoginFinish(){
//     //
//     //     try {
//     //         await this.page.waitForSelector('body > div.wrapper.wrapper--myaccount > div.main > div > div.row.row--alt > div.col-md-4 > div > div > div > div.widget.widget--acount > div.widget__body > a',{timeout:600000});
//     //     } catch (e) {
//     //         throw new Error('登录超时');
//     //     }
//     //
//     //     let cookiesStr = await this.formatCookies(this.page);
//     //     console.log(`登录完毕 cookie:${cookiesStr}`);
//     //
//     //     return cookiesStr;
//     // }
//
//     // async formatCookies(page){
//     //
//     //     let cks = page.cookies(this.targetUrl);
//     //     let cookiesStr = cks.map(cookie => `${cookie.name}=${cookie.value}`).join(";");
//     //
//     //     cookiesStr = cookiesStr.replace(/\ +/g,"");
//     //     cookiesStr = cookiesStr.replace(/[\r\n]/g,"");
//     //     return cookiesStr;
//     // }
//
//     async sleep(ms) {
//         return new Promise(resolve =>
//             setTimeout(resolve, ms)
//         )
//     }
//
//     async camouflageBrowser(){
//         //删掉webdriver属性 以免被检测出为无头浏览器
//         await this.page.evaluateOnNewDocument(() => {
//             const newProto = navigator.__proto__;
//             delete newProto.webdriver;
//             navigator.__proto__ = newProto;
//         });
//
//         //无头浏览器模式下,全局对象下的chrome对象是没有 runtime属性的
//         await this.page.evaluateOnNewDocument(() => {
//             window.navigator.chrome = {
//                 runtime: {}
//             };
//         });
//
//         this.page.on('response',async (response) => {
//             // let isLoginMode = await this.isLoginMode();
//             // if(response.url() === eventUrl && !isLoginMode){
//             //     let body = await response.buffer();
//             //     console.log(`url：${response.url()}  body:${body} isOk:${response.ok()}`);
//             //     body  = JSON.parse(body);
//             //     if(!body.success && this.page.url() !== loginJump){
//             //         console.log(`检测到登录失效,重定向到登录页`);
//             //         await this.retryLogin();
//             //     }
//             // }
//         });
//
//         this.page.on('request', async (request) => {
//             let headers = request.headers();
//             //监听搜索接口
//             if(request.url().indexOf(searchUrl) !== -1){
//                 console.info(`➞ Search: ${request.url()}`);
//                 //频率限制
//                 let valid = await this.searchHandler();
//                 if(valid){
//                     await this.searchTips(request);
//                     return;
//                 }
//             }
//
//             //监听登录成功标志接口
//             // if(request.url().indexOf(logonFlag) !== -1){
//             //     console.info(`➞ Login Request: ${request.url()} status:${request.status}`);
//             //     //如果是从login接口重定向而来,则说明已经重新登录,需要更新cookie
//             //     if(headers['referer'] == loginJump){
//             //         let cookie = await this.page.cookies();
//             //         let cookieStr = await this.parserCookie(cookie);
//             //         console.log(`Is Retry Login. Reset Cookies....${cookieStr}`);
//             //         this.clearCookieCache();
//             //         this.resetCookie(this.productObj.productUserId,cookieStr,this.productObj.token);
//             //     }
//             // }
//             headers['token'] = 112233;
//             delete headers['cookie'];
//             headers['cookie'] = 'mvt1=1;';
//             request.continue({
//                 headers:headers
//             });
//         });
//
//         this.page.once('close',async () => {
//             this.closeFn();
//             await this.closeWindows();
//
//         });
//
//         this.page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36');
//     }
//
//     // async parserCookie(cks){
//     //     let cookiesStr = cks.map(cookie => `${cookie.name}=${cookie.value}`).join(";");
//     //     cookiesStr = cookiesStr.replace(/\ +/g,"");
//     //     cookiesStr = cookiesStr.replace(/[\r\n]/g,"");
//     //     return cookiesStr;
//     // }
//
//     async searchHandler(){
//         if(!this.searchTime){
//             //说明还未开始搜索
//             this.searchTime = new Date().getTime();
//             return false;
//         }
//         //间隔时间
//         let intervalTime = 15000;
//         //计算时间间隔
//         let currentTime = new Date().getTime();
//         let downTime = currentTime - this.searchTime;
//         if(downTime < intervalTime){
//             let t = Math.ceil((intervalTime - downTime) / 1000);
//             console.log(`超出限制 ${t}S后执行`)
//             return true;
//         }
//         this.searchTime = new Date().getTime();
//         return false;
//     }
//
//     async searchTips(request){
//         request.respond({
//             status: 200,
//             contentType: 'text/html;charset=UTF-8',
//             body: '\n' +
//                 '<html>\n' +
//                 '<head><title>提示</title></head>\n' +
//                 '<body>\n' +
//                 '<center><h1>搜索频繁,请稍后再试</h1></center>\n' +
//                 '<hr><center><h3><a href="https://www.merchantwords.com">回首页</a></h3></center>\n' +
//                 '</body>\n' +
//                 '</html>\n'
//         });
//     }
//
//     async alertMessage(message){
//         await this.page.evaluate(() => alert(message));
//     }
//
//     async after(){
//         //新page监听
//         await this.monitorTimer();
//         //注入js
//         await this.injectScript();
//     }
//
//     async injectScript(){
//         //禁用敏感组件
//         await this.disableAssembly()
//     }
//
//     async disableAssembly(){
//         //监听界面数据 禁用账户栏
//         let monitorAccountTimer = setInterval(async () => {
//             try {
//                 let accountElements = await this.page.$$(".header__content-bar > .nav > li");
//                 if(accountElements && accountElements.length !== 0){
//                     for (let i=0;i<accountElements.length;i++) {
//                         if(i == 4){
//                             continue;
//                         }
//                         let el = accountElements[i];
//                         await this.page.evaluate((el, value) => {
//                                 el.setAttribute('style', value)
//                             },
//                             el,
//                             'display:none'
//                         );
//                     }
//                 }
//             }catch (e) {
//             }
//         },500);
//
//         //禁用聊天框
//         let timer4 = setInterval(async () => {
//             try {
//                 let IMDom = await this.page.$("#launcher");
//                 if(IMDom){
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value)
//                         },
//                         IMDom,
//                         'display:none'
//                     );
//                 }
//             } catch (e) {
//             }
//         },500);
//         //填充账号密码
//         let fillAccountTimer = setInterval(async () => {
//
//             try{
//                 let emailSelector = '#field-email-3\\#';
//                 let pwdSelector = '#field-pass-3\\#';
//                 let formSelector = '#loginForm';
//
//                 let accountDom = await this.page.$(emailSelector);
//                 let passwordDom = await this.page.$(pwdSelector);
//                 let formDom = await this.page.$(formSelector);
//
//                 if(formDom){
//                     // await this.page.evaluate(async (el,value) => {
//                     //     el.insertAdjacentHTML('afterend','<div> <input type="password" tabindex="-1"/></div>')
//                     // },formDom,'')
//
//                     //隐藏输入框
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value);
//                         },
//                         accountDom,
//                         'display:none'
//                     );
//
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value);
//                             // el.type = value;
//                         },
//                         passwordDom,
//                         'display:none'
//                     );
//
//                     let oldEmail = await this.page.$eval(emailSelector,input => input.value);
//                     let oldPassword = await this.page.$eval(pwdSelector,input => input.value);
//
//                     if(!oldEmail){
//                         await this.page.evaluate((el, value) => {
//                                 el.setAttribute('value', value)
//                             },
//                             accountDom,
//                             this.userName
//                         );
//                     }
//                     if(!oldPassword){
//                         await this.page.evaluate((el, value) => {
//                                 el.setAttribute('value', value);
//                             },
//                             passwordDom,
//                             this.password
//                         );
//                     }
//                     let subSpan = await this.page.$('#submitButton > span');
//                     await this.page.evaluate((el, value) => {
//                             el.innerText = value
//                         },
//                         subSpan,
//                         '人机验证通过,点我登录,无需输入账号密码！！！'
//                     );
//                 }
//                 // clearInterval(fillAccountTimer)
//             }catch (e) {
//
//             }
//         },500);
//
//
//         let ainfoTimer = setInterval(async () => {
//             try {
//                 let a = await this.page.$('.widgets');
//                 if(a){
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value)
//                         },
//                         a,
//                         'display:none'
//                     );
//                 }
//             }catch (e) {
//             }
//         },1000);
//
//         let proceedTimer = setInterval(async () => {
//             try {
//                 let proceed = await this.page.$('#proceed-button');
//                 if(proceed){
//                     let msg = await this.page.$('#main-message');
//                     let icon = await this.page.$('#icon');
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value)
//                         },
//                         msg,
//                         'display:none'
//                     );
//                     await this.page.evaluate((el, value) => {
//                             el.setAttribute('style', value)
//                         },
//                         icon,
//                         'display:none'
//                     );
//                     await this.page.click('#proceed-button');
//                 }
//             }catch (e) {
//             }
//         },200);
//
//         this.monitorTimers.push(monitorAccountTimer);
//         this.monitorTimers.push(timer4);
//         this.monitorTimers.push(fillAccountTimer);
//         this.monitorTimers.push(ainfoTimer);
//         this.monitorTimers.push(proceedTimer);
//     }
//
//     // async addCookies(domain){
//     //     if(!this.cookie || '' === this.cookie){
//     //         return;
//     //     }
//     //     let cookies = this.cookie.split(';').map(
//     //         pair => {
//     //             let name = pair.trim().slice(0, pair.trim().indexOf('='));
//     //             let value = pair.trim().slice(pair.trim().indexOf('=') + 1);
//     //             return {name, value, domain}
//     //         });
//     //     console.log(`set cookie---:${JSON.stringify(cookies)}`)
//     //     await Promise.all(cookies.map(pair => {
//     //         return this.page.setCookie(pair)
//     //     }))
//     // }
//
//     /**
//      * 删除全局cookie
//      */
//     // async removeCookie(){
//     //     await this.page.setCookie({})
//     // }
//
//     monitorTimer(){
//         //监听新页面
//         let newPageTimer = setInterval(async () => {
//             try {
//                 let pageCache = await this.browser.pages();
//                 if(!pageCache || pageCache.length === 0){
//                     return;
//                 }
//                 for (let i=0;i<pageCache.length;i++){
//                     let otherPage = pageCache[i];
//                     let url = otherPage.url()
//                     if(url.indexOf(this.targetUrl) !== -1 || url.indexOf('chrome://settings') !== -1){
//                         if(otherPage != this.page){
//                             //如果打开了多个魔词界面 强制关闭
//                             console.log(`close a page..  ${pageCache[i].url()}`)
//                             await otherPage.close();
//                         }
//                     }
//                     if(blackList.indexOf(url) !== -1){
//                         await otherPage.close();
//                     }
//
//                 }
//                 pageCache = await this.browser.pages();
//                 if(pageCache.length === 0){
//                     this.closeWindows();
//                 }
//             } catch (e) {
//
//             }
//         },500);
//         this.monitorTimers.push(newPageTimer);
//     }
//
//     /**
//      * 关闭浏览器
//      * @returns {Promise<void>}
//      */
//     async closeWindows(){
//         this.closeFn && this.closeFn()
//         let pages = await this.browser.pages();
//         await pages.forEach(item => item.close());
//         await this.monitorTimers.forEach(item => clearInterval(item))
//         await this.context.close();
//         await this.browser.close();
//         merchant.single = null;
//     }
// }
// merchant.single = null;
//
// // module.exports = merchant;
// export default merchant
